package org.jeecg.modules.utils;

import jakarta.servlet.http.HttpServletRequest;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 功能描述
 *
 * @author: wei
 * @date: 2024年08月06日 18:24
 */
public class GeneralToolsUtil {
    // 定义订单号的日期时间格式
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");

    // 序列号，使用AtomicLong确保线程安全
    private static final AtomicLong sequence = new AtomicLong(0);

    /**
     * 生成订单号
     *
     * @return 生成的订单号
     */
    public static synchronized String generateOrderId() {
        // 获取当前时间戳（格式化为字符串）
        String timestamp = dateFormat.format(new Date());

        // 获取序列号并递增，确保在同一毫秒内也能生成不同的订单号
        long currentSequence = sequence.incrementAndGet();

        // 拼接订单号
        // 假设我们不需要序列号占满固定位数（例如6位），则直接拼接
        // 如果需要固定位数，可以使用String.format("%06d", currentSequence)来格式化
        return timestamp + currentSequence;
    }

    public static String getClientIpAddr(HttpServletRequest request) {
        String ipAddress = request.getHeader("X-Forwarded-For");
        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
            // 如果X-Forwarded-For头信息不存在、为空或值为"unknown"，则使用getRemoteAddr()
            ipAddress = request.getRemoteAddr();
        }

        // 如果X-Forwarded-For存在多个IP地址（由逗号分隔），取第一个
        if (ipAddress != null && ipAddress.indexOf(',') > 0) {
            ipAddress = ipAddress.substring(0, ipAddress.indexOf(','));
        }

        return ipAddress;
    }

}
